import { observer } from "./observe/index";

// 对vue实例中的数据进行初始化
export function  initState(vm){
    let ops = vm.$options
    // console.log(ops);
    // 判断
    if(ops.props){
        // 原型上有这个方法的话就进行初始化
        initProps()
    }
    if(ops.data){
        initData(vm)
    }
    if(ops.computed){
        initComputed()
    }
    if(ops.watch){
        initWatch()
    }
    if(ops.methods){
        initMethods()
    }
}

function initProps(){}
function initMethods(){}
function initComputed(){}
function initWatch(){}

// vue2 对data初始化
function initData(vm){
    // console.log("data初始化");// 对象  函数
    let data = vm.$options.data

    // 如果传过来的是一个函数，那么执行这个函数，否则就等于这个对象
    data = vm._data =  typeof data === 'function' ? data.call(vm) : data    //注意this的指向问题，页面传递过来的数据this指向的是window,将其指向vue实例
    // data数据进行劫持

    // 将data上的所有属性代理到 实例上 {a:1，b:2}
    for (let key in data){
        proxy(vm,"_data",key)
    }
    observer(data)
}
function proxy(vm,source,key){
    Object.defineProperty(vm,key,{  // 在vm实例上添加key这个属性，可以直接通过this来获取data中的值
        get(){
            return vm[source][key]
        },
        set(newValue){
            vm[source][key] = newValue
        }
    })
}

// data{} (1)对象 （2）数组  {a:{b:1},list:[],arr[{}]},对data中的不同类型的数据进行劫持